home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Libraries / Graphic Elements 2 / GEDemo / Grabber.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-30  |  4.3 KB  |  181 lines  |  [TEXT/MPS ]

  1. /*
  2.     Grabber.c
  3.     
  4.     Special Graphic Element to manipulate other Graphic Elements
  5.     
  6.     Copyright 1993 by Al Evans. All rights reserved.
  7.     
  8.     11/29/93
  9.     
  10.     NOTICE:
  11.     
  12.     Because it acts as a "meta-element", this grabber utilizes knowledge of the
  13.     low-level implementation details of graphic elements and sensors. 
  14.     
  15. */
  16.  
  17. #include "Grabber.h"
  18.  
  19. pascal void RenderGrabber(GrafElPtr graphic, GWorldPtr destGWorld)
  20. {
  21. #pragma unused (destGWorld)
  22.     if (graphic->slaveGrafEl)
  23.         FrameRect(&graphic->animationRect);
  24. }
  25.  
  26. void DropSelection(GEWorldPtr world, GrabberPtr grabber)
  27. {
  28.     GrafElPtr element = (GrafElPtr) grabber;
  29.     
  30.     if (element->slaveGrafEl) {
  31.         ChangedRect(world, &element->slaveGrafEl->animationRect);
  32.         element->slaveGrafEl->changeIntrvl = grabber->slaveChgIntrvl;
  33.         element->slaveGrafEl = nil;
  34.         RectZero(&element->animationRect);
  35.     }
  36. }
  37.  
  38. Boolean GetNewSelection(GEWorldPtr world, GrabberPtr grabber, Point mousePt)
  39. {
  40.     GrafElPtr    newSelection = nil;
  41.     GrafElPtr    testElement;
  42.     Rect*        testRect;
  43.     
  44.     testElement = world->drawList;
  45.     
  46.     //Find TOPMOST element which contains mousePt
  47.     while (testElement) {
  48.         testRect = &testElement->animationRect;
  49.         if ((mousePt.v > testRect->top) && (mousePt.v < testRect->bottom) &&
  50.             (mousePt.h > testRect->left) && (mousePt.h < testRect->right) &&
  51.             (testElement->drawPlane >= grabber->minPlane))
  52.             newSelection = testElement;
  53.         testElement = testElement->nextByPlane;
  54.     }
  55.     if (newSelection) {
  56.         ((GrafElPtr) grabber)->slaveGrafEl = newSelection;
  57.         grabber->slaveChgIntrvl = newSelection->changeIntrvl;
  58.         newSelection->changeIntrvl = 0;    //Stop autochanges
  59.         ((GrafElPtr) grabber)->animationRect = newSelection->animationRect;
  60.         ChangedRect(world, &newSelection->animationRect);
  61.         return true;
  62.     }
  63.     else {
  64.     
  65.         return false;
  66.     }
  67. }
  68.  
  69. void ActivateGrabber(GEWorldPtr world, Boolean activate)
  70. {
  71.     GrabberPtr    grabber;
  72.     //SListEntryPtr    thisEntry;
  73.     
  74.     
  75.     grabber = (GrabberPtr) FindElementByID(world, grabberID);
  76.     if (grabber) {
  77.         if (activate) {
  78.             ((GrafElPtr) grabber)->slaveGrafEl = nil;
  79.             grabber->slaveChgIntrvl = 0;
  80.             AddSensorToList(world, grabberID, &world->animationRect);
  81.             ShowElement(world, grabberID, true);
  82.         }
  83.         else {
  84.             DropSelection(world, grabber);
  85.             RemoveSensorFromList(world, grabberID);
  86.             ShowElement(world, grabberID, false);
  87.         }
  88.     }
  89. }
  90.  
  91. pascal Boolean TrackGrabber(GEWorldPtr world, GrafElPtr sensor)
  92. /*
  93.     Is mousePoint inside selection?
  94.         No:  Deselect current selection
  95.              Make new selection
  96.              If new selection == nil return
  97.     While mouseDown
  98.         Drag selection
  99. */
  100. {
  101.     Point    localPt, newPt;
  102.     short    dx;
  103.     short    dy;
  104.     OSType    sensorID;
  105.     
  106.     
  107.     GetMouse(&localPt);
  108.     if (!PtInRect(localPt, &sensor->animationRect)) {
  109.         DropSelection(world, (GrabberPtr) sensor);
  110.         if (!GetNewSelection(world, (GrabberPtr) sensor, localPt))
  111.             return true;
  112.     }
  113.     dx = localPt.h - ((GrafElPtr) sensor)->animationRect.left;
  114.     dy = localPt.v - ((GrafElPtr) sensor)->animationRect.top;
  115.     sensorID = sensor->objectID;
  116.     while(StillDown()) {
  117.         GetMouse(&newPt);
  118.         if (*((long *) &localPt) != *((long *) &newPt)) {
  119.             PtrMoveElementTo(world, sensor->slaveGrafEl, newPt.h - dx, newPt.v - dy, false);
  120.             sensor->animationRect = sensor->slaveGrafEl->animationRect;
  121.             localPt = newPt;
  122.         }
  123.         DoWorldUpdate(world, false);
  124.     }
  125.     return true;
  126. }
  127.  
  128. GrafElPtr MakeGrabber(GEWorldPtr world)
  129. {
  130.     GrafElPtr    grabber;
  131.     
  132.     grabber = NewGrafElement(world, grabberID, grabberPlane, sizeof(Grabber), NoLoader, 0, 0);
  133.     if (grabber) {
  134.         grabber->copyMode = srcCopy;
  135.         grabber->flags = 0;
  136.         grabber->renderIt = RenderGrabber;
  137.         grabber->drawIt = nil;
  138.         grabber->changeIntrvl = 0;
  139.         grabber->trackingProc = TrackGrabber;
  140.         grabber->actionProc = nil;
  141.         ((GrabberPtr) grabber)->slaveChgIntrvl = 0;
  142.         ((GrabberPtr) grabber)->minPlane = 2;
  143.         ((GrabberPtr) grabber)->maxPlane = 32000;
  144.         
  145.         
  146.     }
  147.     return grabber;
  148.     
  149. }
  150.  
  151. Boolean GrabberActive(GEWorldPtr world)
  152. {
  153.     GrafElPtr    grabber;
  154.     grabber = FindElementByID(world, grabberID);
  155.     if    (grabber)
  156.         return (grabber->flags & geShown);
  157.     else
  158.         return false;
  159. }
  160.  
  161. void SetGrabberDepth(GEWorldPtr world, short newMinPlane, short newMaxPlane)
  162. {
  163.     GrabberPtr    grabber;
  164.     grabber = (GrabberPtr) FindElementByID(world, grabberID);
  165.     if (grabber) {
  166.         grabber->minPlane = newMinPlane;
  167.         grabber->maxPlane = newMaxPlane;
  168.     }
  169. }
  170.  
  171. GrafElPtr  CurrentGrabberSelection(GEWorldPtr world)
  172. {
  173.     GrafElPtr    grabber;
  174.     
  175.     grabber = FindElementByID(world, grabberID);
  176.     if (grabber)
  177.         return grabber->slaveGrafEl;
  178.     else
  179.         return nil;
  180. }
  181.